<?php

namespace App\Libs;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use DB;
use Cache;

/* 帮助类 */

class Helper
{
    /* 根据客户端IP获取地理位置 耗时操作  免费接口（限速每天50次，仅供测试）*/
    public static function getAddrByIp($ip)
    {
        $addr = Cache::get($ip);
        if ($addr) {
            return $addr;
        }

        $addr =  DB::table('login_log')->where('ip', $ip)->where('addr', '<>', '未知')->value('addr');

        if (!$addr) {
            # 如果本地库中未找到此IP的地址信息，则去调用第三方api查询  
            $addr = "";
            $urls = [
                
                "http://opendata.baidu.com/api.php?query={$ip}&co=&resource_id=6006&oe=utf8", //{"status":"0","t":"","set_cache_time":"","data":[{"ExtendedLocation":"","OriginQuery":"111.225.246.86","appinfo":"","disp_type":0,"fetchkey":"111.225.246.86","location":"河北省保定市 电信","origip":"111.225.246.86","origipquery":"111.225.246.86","resourceid":"6006","role_id":0,"shareImage":1,"showLikeShare":1,"showlamp":"1","titlecont":"IP地址查询","tplt":"ip"}]}
                "http://freeapi.ipip.net/{$ip}", // ["中国","河北","保定","",""]
            ];
            foreach ($urls as $url) {
                try {
                    $ipContent = file_get_contents($url);
                    $addr_arr = json_decode($ipContent, true);
                    $addr = array_get($addr_arr,'data.0.location','');
                    if($addr){
                        break;
                    }
                    if ($addr_arr[0] === '中国') {
                        # 成功
                        //如果省份和城市相同，则省略城市
                        $addr_arr[2] = $addr_arr[1] === $addr_arr[2] ? '' : $addr_arr[2];
                        $addr = $addr_arr[1] . $addr_arr[2] . $addr_arr[3];
                    }
                } catch (\Throwable $e) {
                    // dd($e->getMessage());
                }
                if($addr != ''){
                    break;
                }
            }
        }

        if ($addr != "") {
            # 写入缓存，防止频繁请求api出错
            // 注意：如果该键已经存在，则直接覆盖原来的值，有效期必须设置，单位是分钟
            // 语法：Cache::put('key', 'value', $minutes);
            Cache::put($ip, $addr, 60*24);
        }
        return $addr ?: '未知';
       
    }
    /* 根据客户端IP获取地理位置 耗时操作  淘宝ip地址库，近期不稳定*/
    public static function getAddrByIp_bak($ip)
    {
        $addr = Cache::get($ip);
        if ($addr) {
            # code...
            return $addr;
        }

        $addr =  DB::table('login_log')->where('ip', $ip)->where('addr', '<>', '未知')->value('addr');

        if (!$addr) {
            # 如果本地库中未找到此IP的地址信息，则去调用第三方api查询  “淘宝IP地址库”
            $addr = "";
            $url = "http://ip.aliyun.com/service/getIpInfo.php?ip=$ip";
            try {
                $ipContent = file_get_contents($url);
                $addr_arr = json_decode($ipContent, true);
                // dd($addr_arr);
                if ($addr_arr['code'] === 0) {
                    # 成功
                    //如果国家为中国就省略
                    $country = $addr_arr['data']['country'] === '中国' ? '' : $addr_arr['data']['country'];
                    //如果省份和城市相同，则省略城市
                    $city = $addr_arr['data']['region'] === $addr_arr['data']['city'] ? '' : $addr_arr['data']['city'];
                    //如果县为“XX”，则忽略。 "county" => "XX"
                    $county = $addr_arr['data']['county'] === "XX" ? "" : $addr_arr['data']['county'];
                    $addr = $country . $addr_arr['data']['region'] . $city . $county;
                } else {
                    $addr = "未知";
                }
            } catch (\Throwable $e) {
                $addr = "未知";
            }
        }
        if ($addr != "未知") {
            # 写入缓存，防止频繁请求api出错
            // 注意：如果该键已经存在，则直接覆盖原来的值，有效期必须设置，单位是分钟
            // 语法：Cache::put('key', 'value', $minutes);
            Cache::put($ip, $addr, 60*24);
        }
        return $addr;
       
    }

    /* 获取客户端真实的IP地址 */
    public static function getClientIp()
    {
        return request()->getClientIp();

        $ip = FALSE;
        //客户端IP 或 NONE 
        if (!empty($_SERVER["HTTP_CLIENT_IP"])) {
            $ip = $_SERVER["HTTP_CLIENT_IP"];
        }

        //多重代理服务器下的客户端真实IP地址（可能伪造）,如果没有使用代理，此字段为空
        if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $ips = explode(", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
            if ($ip) {
                array_unshift($ips, $ip);
                $ip = FALSE;
            }

            for ($i = 0; $i < count($ips); $i++) {
                //提示 eregi 函数找不到，可能已经弃用
                if (!eregi("^(10│172.16│192.168).", $ips[$i])) {
                    $ip = $ips[$i];
                    break;
                }
            }
        }

        //客户端IP 或 (最后一个)代理服务器 IP 
        return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
    }
}
